package com.shihan.listener.rabbitmq;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;

import java.io.UnsupportedEncodingException;

/**
 * @Description 注意：一个消息过来，只能触发其中一个 @RabbitListener 标注的监听方法，即不能有多个监听方法同时被触发；
 * @Author shihan
 * @Date 2020/12/26 20:53
 * @Version 1.0
 */
@Component      // 自定义的消息监听类，需要加上 @Component，即放到 IOC 容器中进行管理
public class MyMessageListener {

    // 1、使用 @RabbitListener 注解标注的方法，即为队列的监听回调方法；
    // 2、queues 指明当前的监听回调方法，监听的是哪些队列；
    // 3、自定义监听回调的方法，他的形参个数及其种类，在 @RabbitListener 中有表明

    /**
     * com.rabbitmq.client.Channel -- channel 对象
     * org.springframework.amqp.core.Message -- 可以直接操作原生的 AMQP 消息
     * org.springframework.messaging.Message to use the messaging abstraction
     * @Payload 注解方法参数，该参数的值就是消息体
     * @Header 注解方法参数，访问指定消息头字段的值
     * @Headers 该注解标注的方法参数，获取消息头中所有字段信息，对应类型为 Map
     * MessageHeaders 访问所有消息头字段
     * MessageHeaderAccessor or AmqpMessageHeaderAccessor 访问所有消息头字段
     */
    @RabbitListener(queues = {"queue.anno.q01"})
    public void whenMessageCome(Channel channel, Message message) throws UnsupportedEncodingException {
        System.out.println("注解方式，自动监听队列消息：" + new String(message.getBody(),message.getMessageProperties().getContentEncoding()));
    }

    // 注意：一个消息过来，只能触发其中一个 @RabbitListener 标注的监听方法，即不能有多个监听方法同时被触发；
    /*@RabbitListener(queues = {"queue.anno.q01"})
    public void whenMessageCome(@Payload String messageStr){
        System.out.println("注解方式，自动监听队列消息（@Payload）：" + messageStr);
    }*/

}
